package com.wmwj.hxlj.utils;

import lombok.Data;
import org.springframework.beans.BeanUtils;

import java.util.List;
import java.util.stream.Collectors;

/**
 * BeanCopyUtils 是一个工具类，用于实现对象之间的属性复制。
 * 该类提供了静态方法，支持单个对象和对象列表的复制操作。
 */
public class BeanCopyUtils {

    /**
     * 私有构造函数，防止实例化。
     */
    private BeanCopyUtils() {
    }

    /**
     * 将源对象的属性复制到目标类的实例中。
     *
     * @param source 源对象，其属性将被复制。
     * @param clazz  目标类的Class对象，用于创建目标实例。
     * @param <V>    目标对象的类型。
     * @return 返回目标类的实例，包含源对象的属性值。如果复制过程中发生异常，返回null。
     * @throws IllegalArgumentException 如果源对象或目标类为空。
     * @throws RuntimeException 如果复制过程中发生异常。
     */
    public static <V> V copyBean(Object source, Class<V> clazz) {
        if (source == null || clazz == null) {
            throw new IllegalArgumentException("信息不能为空");
        }

        // 创建目标对象
        V result = null;
        try {
            result = clazz.getDeclaredConstructor().newInstance();
            // 使用BeanUtils实现属性复制
            BeanUtils.copyProperties(source, result);
        } catch (Exception e) {
            throw new RuntimeException("复制bean属性失败", e);
        }
        // 返回复制后的目标对象
        return result;
    }

    /**
     * 将源对象列表中的每个对象的属性复制到目标类的实例中，并返回目标对象的列表。
     *
     * @param list  源对象列表，其属性将被复制。
     * @param clazz 目标类的Class对象，用于创建目标实例。
     * @param <O>   源对象的类型。
     * @param <V>   目标对象的类型。
     * @return 返回目标对象的列表，包含源对象列表中每个对象的属性值。
     */
    public static <O, V> List<V> copyBeanList(List<O> list, Class<V> clazz) {
        // 使用流操作将每个源对象复制为目标对象，并收集为列表
        return list.stream()
                .map(o -> copyBean(o, clazz))
                .collect(Collectors.toList());
    }
}
